package business;

import java.util.ArrayList;
import java.util.List;

import constants.DocumentConstants;

public class DocumentBusiness {
	private static final int TAMANHO_CPF = 11;
	private static final int TAMANHO_CNPJ = 14;
	private static final int MODULO_11 = 11;
	
	public static boolean validarCPF(String cpf) throws NumberFormatException{
		Long numberDoc = Long.parseLong(cpf);
		String corpo = null;
		String digito = null;
		cpf = formatarDocumento(cpf, TAMANHO_CPF);
		
		corpo = cpf.substring(0,9);
		digito = cpf.substring(9);
		
		int soma = calcularSomatorioCPF(corpo, 10);
		
		int digitoCalculado1 = MODULO_11-(soma%MODULO_11);
		
		corpo = corpo+digitoCalculado1;
		
		int novaSoma = calcularSomatorioCPF(corpo, TAMANHO_CPF);
		
		int digitoCalculado2 = novaSoma%MODULO_11;
		
		if(digitoCalculado2<3){
			digitoCalculado2 = 0;
		}else{
			digitoCalculado2 = 11-digitoCalculado2;
		}
		
		StringBuffer sb = new StringBuffer();
		sb.append(digitoCalculado1);
		sb.append(digitoCalculado2);
		
		System.out.println(sb.toString());
		
		return digito.equals(sb.toString());
	}
	
	public static boolean validarCNPJ(String cnpj) throws NumberFormatException{
		Long numberDoc = Long.parseLong(cnpj);
		String corpo = null;
		String digito = null;
		cnpj = formatarDocumento(cnpj, TAMANHO_CNPJ);
		
		System.out.println(cnpj);
		
		corpo = cnpj.substring(0,12);
		digito = cnpj.substring(12);
		
		int soma = calcularSomatorioCNPJ(corpo, 13, 1);
		
		int digitoCalculado1 = 11-(soma%MODULO_11);
		
		corpo = corpo+digitoCalculado1;
		
		int novaSoma = calcularSomatorioCNPJ(corpo, TAMANHO_CNPJ, 2);
		
		int digitoCalculado2 = novaSoma%MODULO_11;
		
		if(digitoCalculado2<3){
			digitoCalculado2 = 0;
		}else{
			digitoCalculado2 = 11-digitoCalculado2;
		}
		
		StringBuffer sb = new StringBuffer();
		sb.append(digitoCalculado1);
		sb.append(digitoCalculado2);
		
		System.out.println(sb.toString());
		
		return digito.equals(sb.toString());
	}
	
	private static String formatarDocumento(String doc, int tamanho) throws NumberFormatException{
		if(doc.length()>tamanho){
			throw new NumberFormatException();
		}else if(doc.length()!=tamanho){
			for(int i = tamanho-1; i > 1; i--){
				if(doc.length()==i){
					String zeros = "";
					int j = i;
					while(j<tamanho){
						zeros = zeros + "0";
						j++;
					}
					doc = zeros + doc;
					break;
				}
			}
		}
		return doc;
	}
	
	private static int calcularSomatorioCPF(String numero, int tamanho) throws NumberFormatException{
		int soma = 0;
		for(int i = 0; i < numero.length(); i++){
			int num = Integer.parseInt(String.valueOf(numero.charAt(i)));
			soma += num * (tamanho-i);
			System.out.println(num +"*"+(tamanho-i)+"="+soma);
		}
		System.out.println(soma);
		return soma;
	}
	
	private static int calcularSomatorioCNPJ(String numero, int tamanho, int indexDigito) throws NumberFormatException{
		int soma = 0;
		List<Integer> pesoCNPJ = null;
		if(indexDigito==1){
			pesoCNPJ = DocumentConstants.pesosPrimeiroDigitoCNPJ;
		}else if(indexDigito==2){
			pesoCNPJ = DocumentConstants.pesosSegundoDigitoCNPJ;
		}else{
			throw new NumberFormatException();
		}
		//TODO - CORRIGIR FOR PARA CNPJ
		int i = 0;
		for(Integer num:pesoCNPJ){
			int n = Integer.parseInt(String.valueOf(numero.charAt(i)));
			soma += num * (n);
			System.out.println(n +"*"+(num)+"="+soma);
		}
		System.out.println(soma);
		return soma;
	}

	public static String verificarUFCPF(String cpf) throws NumberFormatException{
		Long numberCPF = Long.parseLong(cpf);
		String corpo = null;
		String digito = null;
		cpf = formatarDocumento(cpf, 11);
		
		corpo = cpf.substring(0,9);
		digito = cpf.substring(9);
		
		int digitoUF = Integer.parseInt(String.valueOf(corpo.charAt(corpo.length()-1)));
		
		return DocumentConstants.getCPFArea(digitoUF);
	}
	
}
